
// 集合类(观察者模式辅助类)
(function($){

    // 私有成员
    var _elements;

    // 构造函数
    var ObserverCollection = window.ObserverCollection = function()
    {
        _elements = new Array();
    }

    // 增加元素
    ObserverCollection.prototype.add = function( obj )
    {
        _elements.push( obj );
    }

    // 删除元素
    ObserverCollection.prototype.remove = function( obj )
    {
        for( var i=0; i<_elements.length; i++ ){
            if( obj === _elements[i] ){
                _elements.splice( i,1 );
            }
        }
    }

    // 元素个数
    ObserverCollection.prototype.count = function()
    {
        return _elements.length;
    }

    // 取得元素
    ObserverCollection.prototype.item = function( i )
    {
        return _elements[i];
    }
})(jQuery);

// App类,应用程序入口类
(function($){
    // [静态]私有成员
    var _observers = new ObserverCollection();    // 观察者集合

    // [静态]历史管理
    var my_history = window.my_history = new HistoryStack();
    my_history.load();

    // 构造函数
    var App = window.App = function()
    {
        // 子系统类
        var docs  = new Docs();      
        
        // 初始化界面
        App.ui.init();

        // 点击事件绑定
        App.ui.AClick();

        // 初始化第一个命令
        if( !location.hash ){
            location.hash = "#welcome";
        }

        App.fn.listening( location.hash );
    };

    // 全局属性
    App.current =
    {
        query : null,
        hashValue : ""
    };

    // 方法
    App.fn = App.prototype =
    {
        attach : function( ob )      // 注册
        {
            _observers.add( ob );
        },
        detach : function( ob )      // 撤销
        {
            _observers.remove( ob );
        },
        notify : function( cmd )     // 通知,调用所有观察者的listening方法
        {
            for( var i=0; i<_observers.count(); i++ ){
                if( _observers.item(i) ){
                    _observers.item(i).listening(cmd);
                }
            }
        },

        // 各种功能集成
        listening : function( hashValue )
        {
            // 消息分发
            var cmd = App.current.query =$.toNameValueCollection( $.trim(hashValue).replace("#","") );
            this.notify( cmd );
            
            if( hashValue != my_history.getCurrent() ){
                // 当前状态
                location.hash = App.current.hashValue = hashValue;
                App.current.query = cmd;
                
                // 记录历史    
                my_history.addResource( hashValue );
            }

            // 同步菜单
            App.ui.navListener();
        }
    };

    // 界面
    App.ui = 
    {
        // 框架属性
        frame  : $("#wrapper"),
        frameT : $("#header"),
        frameB : $("#footer"),
        frameL : $("#column-A"),
        frameR : $("#column-B"),
        menu : $("#main-menu"),

        // 初始化框架
        init : function()
        {
            // 加载主要菜单
            App.ui.frameL.find("#main-menu").append( Conf.get_menus(['welcome',
                                                                     'divi',
                                                                     'profile',
                                                                     'product',
                                                                     'news',
                                                                     'docs',
                                                                     'divi',
                                                                     'blog',
                                                                     'forum',
                                                                     'gsbook',
                                                                     'wiki',
                                                                     'divi',
                                                                     'rbac',
                                                                     'fs',
                                                                     'visit',
                                                                     'spider']) );

            var t = this;
            $("#btn-hide-column-A").click(function(){   // 收起左栏
                t.frameL.toggleClass("hide");
                t.frameR.toggleClass("column-B-spread");
            });

            // 事件监听
            $(".btn_logout").click(function(){
                $.getJSON( "app_load.aspx?view=json&op=Logout",function(json){
                    if( !json.error ){
                    		location.href="login.aspx";
                    }
                });
          			return false;
          	});

            return this;
        },

        // 创建主要内容框架
        createContentFrame : function()
        {
            // 创建主要内容框架,并添加到可视区域
            var toolbarT = $('<div class="global_toolbar"></div>');
            var toolbarB = $('<div class="global_toolbar"></div>');
            var content = $('<div class="global_content"></div>');

            var page = App.ui.frameR.empty()
                             .append(toolbarT)
                             .append(content)
                             .append(toolbarB);

            // 填充工具条
            toolbarT.append( this.createToolbarItems(["return","reload","forward"]) );
            toolbarB.append( this.createToolbarItems(["return","reload","forward"]) );

            // 事件监听
            var t = this;
            page.find(".btn_reload").click(function(){
                var h = my_history.getCurrent();
                if( h ){
                		App.fn.listening( h );
                }

                return false;
            });
            page.find(".btn_return").click(function(){
                if( my_history.hasPrev() ){
                    my_history.go(-1);
                    App.fn.listening( my_history.getCurrent() );
                }
                return false;
            });
            page.find(".btn_forward").click(function(){
                if( my_history.hasNext() ){
                    my_history.go(1);
                    App.fn.listening( my_history.getCurrent() );
                }
                return false;
            });

            return content;
        },
        // 创建弹出窗口
        createPopup : function( css )
        {
            var wrap = $('<div class="global_popup"><span class="close" style="float:right;">关闭</span></div>');
            if( 'undefined'!=typeof css ){  wrap.css( css );   }


            var content = $('<div class="content"></div>');
            App.ui.frame.append( wrap.append(content) );  //添加到显示区域

            wrap.find(".close").click(function(){
            		wrap.remove();
            });

            return content;
        },
        popupAlert: function(content,disp)
        {
            if( 'undefined'==typeof(disp) ){
                disp = App.ui.createPopup({top:'30%',left:'40%'});  //显示区域
            }
            disp.empty()
                .append('<div><h3>' + content + '</h3></div>')
                .append('<div><button class="close">确定</button></div>')

            // 事件监听
            disp.find('.close').click(function(){
                disp.parent().remove();
            });

            return disp;
        },

        // 突出显示导航的当前项
        navListener : function ()
        {
            // 获取导航条对应数组
            var nav = this.menu.get(0);   //document.getElementById("main-menu");
            nav = nav.getElementsByTagName("LI");
            if( 1>nav.length ){  return;  }

            // 当前元素
            var a = location.hash.split('&');
            var curEl = a[0];
            var curIdx = 0;

            // 历遍 navs
            for ( var i=0; i<nav.length; i++ ){
                nav[i].className = "";
                if( "" != curEl && 0 <= nav[i].getElementsByTagName("A")[0].href.indexOf(curEl) )
                {   curIdx = i;    }
            }

            nav[curIdx].className = "current";
        },

        // 创建按工具按钮
        createToolbarItems : function( ss )
        {
            var items = new Array();
            items["reload"] = '<a class="btn_reload" href="#reload" title="刷新当前页面">刷新</a>';
            items["return"] = '<a class="btn_return" href="#return" title="返回上一页">退后</a>';
            items["forward"] = '<a class="btn_forward" href="#forward" title="返回下一页">向前</a>';

            var curItems = new Array();
            for( var i=0,len=ss.length;i<len;i++ )
            {
                curItems.push( items[ss[i]] );
            }

            return $( curItems.join( " - " ) );
        },
        
        // 绑定a标签的click事件
        AClick : function()
        {
            $(document).click(function( ev )
            {
                // 只监听左键, 0是ff的左键,1是ie左键
                if( 0 == ev.button || 1 == ev.button )
                {
                    // 过滤A和Img
                    var tag = ev.target;
                    if( "A" == tag.tagName  || "IMG" == tag.tagName )
                    {
                        while( tag )
                        {
                            if( "A" == tag.tagName ){
                                break;
                            }else{
                                tag = tag.parentNode;
                            }
                        }

                        if( !tag ){
                            return false;
                        }else{
                            App.fn.listening( tag.hash );
                        }
                    }
                }
            });
        }
    };
})(jQuery);
